Adapter Pattern

Adapter Pattern ဆိုတာကတော့ Structural Pattern တစ်ခုပါ။ Adapter ဆိုတာနဲ့ ပလပ်ပေါက်တွေ မှာ ထပ်မရရင် သုံးသည့် adapter ကို တန်းမြင်ကြမှာပါ။

Adapter Pattern က အဲဒီ အတိုင်းပါပဲ။ မတူညီသည့် class နှစ်ခုကို တစ်ခု နဲ့ တစ်ခု သုံးလို့ ရအောင် ပြောင်းပေးတာပါ။ Adapter Pattern ကို framework တော်တော်များများမှာ database connection အတွက် adapter pattern ကို သုံးထားတာကို တွေ့ဘူး ပါလိမ့်မယ်။ MySQL သုံးချင်ရင် MySQL Adapter သုံး။ Postgres သုံးချင်ရင် Postgres adapter သုံး။ မူရင်း code ကတော့  database ပြောင်းပေမယ့် code level မှာတော့ ဘာမှ​မပြောင်းလဲ ပဲ သုံးနေလို့ရတာမျိုးပေါ့။

Adapter Pattern ရဲ့ class diagram ကို ကြည့်ကြည်ပါ။​ တစ်ခုခု ကို Convert ပြောင်းပေးဖို့ ကြားခံသုံးထားတာ ကို တွေ့ရမှာပါ။ 

ဥပမာ အနေနဲ့ User ဘက်မှာ လိုချင်သည့် data က km နဲ့ ပဲလိုချင်တယ်။ လက်ရှိ library က km နဲ့ ပြန်မထုတ်ပေးနိုင်ဘူး။ point ၂ ခု ကို တွက်ပြီးရင် mile ပဲ response ပြန်ပေးနိုင်တယ်။

ဒါဆိုရင် ကျွန်တော်တို့ တွေက ကြားခဲ့ km to mile ပြောင်းသည့် adapter ကို ခံပြီး သုံးဖို့ လိုပါပြီ။

Java code ကို ကြည့်ရအောင်။

DistanceCalculator.java

class DistanceCalculator {
    public double distanceByMile(String origin, String dest) {
        return (new Random()).nextInt(100);
    }
} 

DistanceCalculatorAdapter.java

interface DistanceCalculatorAdapter {
    double distanceByKm(String origin, String dest);
}

KiloDistanceAdapterCalculator.java

class KiloDistanceAdapterCalculator implements DistanceCalculatorAdapter {
    private DistanceCalculator distanceCalculator;

    public KiloDistanceAdapterCalculator(DistanceCalculator distanceCalculator) {
        this.distanceCalculator = distanceCalculator;
    }

    @Override
    public double distanceByKm(String origin, String dest) {
        double distanceInMiles = distanceCalculator.distanceByMile(origin, dest);
        double distanceInKm = distanceInMiles * 1.609344; // Convert miles to kilometers
        return distanceInKm;
    }
}

App.java

public class App {
 public static void main(String[] args) {
   DistanceCalculator distanceCalculator = new DistanceCalculator();
   double distanceInMiles = distanceCalculator.computeDistance("city1", "city2"); 
   System.out.println("The distance between city1 and city2 ="+distanceInMiles+" miles");

   DistanceCalculatorAdapter distanceAdapter = new KiloDistanceAdapterCalculator(distanceCalculator);
   double distanceInKilometers = distanceAdapter.distanceByKm("city3", "city4");
   System.out.println("The distance between city3 and city4 ="+distanceInKilometers+" kilometers");
 }
}

Adapter pattern ကို file converter တွေ မှာလည်း အသုံးပြုနိုင်တယ်။ လက်ရှိ ရှိနေတာက file ကို csv နဲ့ လိုချင်တယ်။ File က JSON ဖြစ်နေတာ ဖြစ်နိုင်သလို XML ဖြစ်နေတာလည်း ဖြစ်နိုင်တယ်။ Excel ဖြစ်နေတာလည်း ဖြစ်နိုင်ပါတယ်။ အဲဒီ အခါမှာ adapter pattern ကို အသုံးပြုပြီး ဖြေရှင်းနိုင်ပါတယ်။

Pros and Cons

Adapter pattern သုံးခြင်းဖြင့် Single Responbility ကို လိုက်နာထားသလို Open/Close Principle ကိုလည်း လိုက်နာပါတယ်။

မလိုအပ်ပဲ သုံးရင်တော့ interface တွေ အရမ်းများသွားတာ ဖြစ်နိုင်ပါတယ်။